home *** CD-ROM | disk | FTP | other *** search
/ Aminet 50 / Aminet 50 (2002)(GTI - Schatztruhe)[!][Aug 2002].iso / Aminet / util / cli / netid.lha / netid.c < prev    next >
C/C++ Source or Header  |  2002-05-17  |  3KB  |  123 lines

  1. /*
  2.       NetID 0.2,  Calculates NetID and the number of hosts && nets
  3.                   for a given IP-number and Subnet-mask.
  4.       Copyright © 2002 Kalle Räisänen.
  5.  
  6.     This program is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 2 of the License, or
  9.     (at your option) any later version.
  10.  
  11.     This program is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with this program; if not, write to the Free Software
  18.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  
  20.       Syntax: NetID ip-number subnet-mask
  21. */
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <math.h>
  25.  
  26. int netid[4], ip[4], sub[4];
  27.  
  28. int countbits(int num)
  29. {
  30.    int ret = 0, i;
  31.  
  32.    for(i = 0; i < 8; i++)
  33.       if(num & (1<<i))
  34.          ret++;
  35.  
  36.    return ret;
  37. }
  38.  
  39. int toip(char *s, int *ip)
  40. {
  41.    int i = 0, j = 0;
  42.  
  43.    while(s[j])
  44.       {
  45.       if(s[j] == '.')
  46.          {   
  47.          if(ip[i] > 255) return 0;
  48.          i++;
  49.          }
  50.       else if((s[j] >= '0') && (s[j] <= '9'))
  51.          {
  52.          ip[i] *= 10;
  53.          ip[i] += s[j] - '0';
  54.          }
  55.       else
  56.          return 0;
  57.       j++;
  58.       }
  59.    if(ip[i] > 255) return 0;
  60.    return 1;
  61. }
  62.  
  63. void getnetid(int *netid, int *ip, int *sub)
  64. {
  65.    int i = 0;
  66.  
  67.    for(; i < 4; i++)
  68.       netid[i] = sub[i] & ip[i];
  69. }
  70.  
  71. unsigned int nets = 0, hosts = 0;
  72.  
  73. void getnets(int *subm, int ipcl)
  74. {
  75.    int i = 1, nbit = 0, hbit = 0;
  76.  
  77.    if(ipcl >= 192)
  78.       i = 3;
  79.    else if(ipcl >= 128)
  80.       i = 2;
  81.  
  82.    for(;i < 4; i++)
  83.       {
  84.       nbit += countbits(subm[i]);
  85.       hbit += countbits(~subm[i]);
  86.       }
  87.    nets = abs(pow(2, nbit)-2);
  88.    hosts = abs(pow(2, hbit)-2);
  89. }
  90.  
  91. int main(int argc, char *argv[])
  92. {      
  93.    printf("\nNetID 0.2, Copyright (c) 2002 Kalle Raisanen.\n\n");
  94.  
  95.    if(argc != 3)
  96.       {
  97.       fprintf(stderr, "\tUsage: %s ip sub\n\n", argv[0]);
  98.       fprintf(stderr, "\tWhere ip is the IP-adress and sub the Subnet-mask.\n");
  99.       return 0;
  100.       }
  101.  
  102.    if(!toip(argv[1], ip))
  103.       {
  104.       fprintf(stderr, "%s isn't a valid IP-adress!\n", argv[1]);
  105.       return 0;
  106.       }
  107.  
  108.    if(!toip(argv[2], sub))
  109.       {
  110.       fprintf(stderr, "%s isn't a valid IP-adress!\n", argv[2]);
  111.       return 0;
  112.       }
  113.  
  114.    getnetid(netid, ip, sub);
  115.    getnets(sub, ip[0]);
  116.    printf("    %d.%d.%d.%d/%d:\n", ip[0], ip[1], ip[2], ip[3],
  117.                                countbits(sub[0]) + countbits(sub[1]) + countbits(sub[2]) + countbits(sub[3]));
  118.    printf("\tNet ID: %d.%d.%d.%d\n", netid[0], netid[1], netid[2], netid[3]);
  119.    printf("\t%d nets, %d hosts.\n\n", nets, hosts);
  120.  
  121.    return 0;
  122. }
  123.